昨天提到了圖磚(Tiles)的切法。不過值得注意的是,在範例中的 OSM 和 NLSC 圖磚,其提供的格式都是「圖片」。咦?「圖」磚不就是一塊塊正方形的圖片嗎? 其實在英文裡,Tile 僅僅只有「磚」的意思,只是中文習慣稱作「圖磚」(我猜是「地圖磚塊」的簡稱吧?)
以圖片為格式的圖磚,被稱作點陣圖磚(Raster Tile)。與之相對地,還有被稱為向量圖磚(Vector Tile)的種類。
原始的 GIS 資料已經預先渲染,因此圖磚的內容就是客戶端看到的地圖,前端毋需任何額外操作即可使用。這也意味著對終端使用者來講,硬體的性能不需要太高。與之相對地,伺服器端要產生點陣圖磚,會需要投入相對多的資源。
點陣圖磚一般會有 256x256 或 512x512 等兩種圖片大小,單一圖磚的大小可能從數十到數百KB不等。考量到圖片解析度,一張地圖需要由多個點陣圖磚組成,對頻寬的需求不可謂不大,在地圖上平移和縮放期間的載入時間可能會更長。
向量圖磚則並非由影像組成,它的內容通常由點、線段或多邊形等地理資訊,以及各種自訂屬性的資料組成。地圖公司 Mapbox 於 2014 年提出 Mapbox Vector Tile 標準,簡寫為 MVT。通常來講,雖然 Google Map 也使用不公開規格的向量圖磚,但由於 MVT 是開放的標準,普及度較高,一般網路上在講的向量圖磚指的就是這種格式。
也因為它僅僅包含原始資料,客戶端取得後需要使用自訂的樣式進行渲染,接著才是人眼可見的地圖。樣式檔案通常是一份文字文件,定義哪些種類的地圖元素需要呈現哪種外觀,以及使用什麼字體和語言來渲染各種標籤。
與點陣圖磚比較,既然一切都在客戶端渲染,那麼向量圖磚就可以輕鬆地以最少的資源動態更新地圖的外觀。地圖在所有縮放層級上都可以銳利地顯示,而不會有點陣圖磚的解析度問題。
向量圖磚會因為所在位置和需求而包含不同原始資料,因此大小變化很大(例如,空無一物的海上和路網交錯的城市,其大小可能分別為 <1KB 和數百KB)。但就最普遍的圖磚服務來講,平均下來,其大小約為點陣圖磚的 20-50%,因此比較起來傳輸時間更短,處理所需的資源也更少。
MVT 是由 pbf(Protocol Buffers/protobufs) 格式所包裏,這種由 Google 公開標準的格式類似於一種壓縮方法,使用.proto
來定義資料結構。MVT 的 .proto
檔內容大致如下:
package vector_tile;
option optimize_for = LITE_RUNTIME;
message Tile {
...
enum GeomType {
UNKNOWN = 0;
POINT = 1;
LINESTRING = 2;
POLYGON = 3;
}
...
message Value {
...
}
// Features are described in section 4.2 of the specification
message Feature {
optional uint64 id = 1 [ default = 0 ];
// Tags of this feature are encoded as repeated pairs of
// integers.
...
repeated uint32 tags = 2 [ packed = true ];
// The type of geometry stored in this feature.
optional GeomType type = 3 [ default = UNKNOWN ];
...
repeated uint32 geometry = 4 [ packed = true ];
}
// Layers are described in section 4.1 of the specification
message Layer {
...
required string name = 1;
// The actual features in this tile.
repeated Feature features = 2;
...
}
repeated Layer layers = 3;
...
}
這邊並不對 .proto
檔案的語法作過多描述。不過只要大致掃一下,從檔案內容中也不難猜到 MVT 的資料結構:
Tile
Tile
內可包含多個 Layer
Layer
內可包含多個 Feature
Feature
內可包含多個 tag
,用以表示各種自訂屬性Feature
的 GeomType
(幾何性質) 一定是 UNKNOWN
(未知), POINT
(點), LINESTRING
(線段), POLYGON
(多邊形)任一種Feature
的幾何形狀由 geometry
決定因此由下至上,我們可以說圖磚內包含的基本單位是 Feature
,它有自己在圖磚空間中的形狀位置,也有一堆屬性可以定義。而一群相關的 Feature
可以組成一個 Layer
。
例如在實務上,圖磚製作者可能將一堆建築物的 Feature
組成名稱為 buildings
的 Layer
,一堆道路的 Feature
組成名稱為 transportation
的另一個 Layer
。
用 Layer
分組的好處在於:渲染地圖時,樣式檔案可以根據 Layer
來定義規則,一次渲染其內含有的所有 Feature
! (當然根據 Feature
的各種屬性值,同一 Layer
內的 Feature
其渲染的結果也可能不同)
向量圖磚正是本次系列文的主角,和點陣圖磚比起來有以下優缺點:
優點:
缺點:
我會在之後的文章中提到如何利用開源軟體自行產製向量圖磚,並製作相應的渲染樣式。